package simplemaven2.vt;

import org.apache.log4j.Logger;
import ru.chezclif.lern.conread.Preconditions;
import ru.chezclif.lern.conread.PropertyElements;
import ru.chezclif.lern.conread.PropertyManager;
import ru.chezclif.lern.conread.readers.PropertyReader;
import simplemaven2.vt.data.Config;
import simplemaven2.vt.utils.BeanUtils;
import simplemaven2.vt.utils.Settings;
import java.io.File;
import java.io.Serializable;

/**
 * Страница для выгрузки пользователю конфига в выбранном формате
 *
 * @author Vit
 */
public class DownloadRightBean implements Serializable {
    /**
     * Название конфига
     */
    private String configName = "";
    /**
     * Флаг, обозначающий что ссылка пользователю готова
     */
    private Boolean flagForDownload = false;
    /**
     * Промежуточный конфиг
     */
    private Config deltaConfig = null;
    /**
     * Название типа конфига: xml, properties, ini
     */
    private String protocol = "";
    /**
     * Путь до сформированного файла для скачивания
     */
    private String pathToDownloadFile = "";
    /**
     * Стандартный логгер
     */
    private static final Logger logger = Logger.getLogger(DownloadRightBean.class);

    /**
     * Конвертирует из протокола в расшмирение файла
     *
     * @param protocol Протокол
     */
    public String convertFromProtToExt(String protocol) {
        Preconditions.notNull(protocol);
        Preconditions.notBlank(protocol);
        if (protocol.equals("xml")) return ".xml";
        if (protocol.equals("ini")) return ".ini";
        if (protocol.equals("props")) return ".properties";
        return "";
    }

    /**
     * СОхранение файла в папку, выгрузка пользователю через сервлет и очистка переменных
     */
    public void saveFile() {
        PropertyManager propertyManagerAccess = new PropertyManager();
        PropertyReader propertyReader = propertyManagerAccess.getPropertyReader();
        for (PropertyElements propertyElements : deltaConfig.getConfigList().getElements()) {
            propertyReader.setSetting(propertyElements.getKey(), propertyElements.getValue());
        }
        propertyReader.setHeaderComment(deltaConfig.getHeaderComment());
        propertyReader.setFooterComment(deltaConfig.getFooterComment());
        pathToDownloadFile = deltaConfig.getConfigName().trim() + convertFromProtToExt(protocol);
        propertyReader.saveFile(protocol + "://" + Settings.getPathToDownload() + pathToDownloadFile);
        flagForDownload = true;
        logger.info("File load to servlet");
    }

    /**
     * Вернуться на главную страницу после скачивания файла
     */
    public void goDefPageAfterDownload() {
        File fileForDel = new File(Settings.getPathToDownload() + pathToDownloadFile);
        if (fileForDel != null) {
            fileForDel.delete();
        }
        clearSettings();
        goEmptyPage();
    }

    /**
     * Очистка переменных
     */
    public void clearSettings() {
        this.pathToDownloadFile = "";
        this.configName = "";
        this.protocol = "";
        this.flagForDownload = false;
        this.deltaConfig = null;
    }

    /**
     * Перенаправляет на пустую страницу
     */
    private void goEmptyPage() {
        LegalBean legalBean = (LegalBean) BeanUtils.getBean("legalbean");
        Preconditions.notNull(legalBean);
        legalBean.setNowUsedPage(0);
        logger.info("Go to the Empty page");
    }

    /**
     * Пенренавправляет на страницу выгрузки конфига пользователю, а так же вводит копию конфига и его название
     */
    public void goDownloadPage() {
        MenuLeftBean menuLeftBean = (MenuLeftBean) BeanUtils.getBean("menuleftbean");
        Preconditions.notNull(menuLeftBean);
        EditConfigRightBean editConfigRightBean = (EditConfigRightBean) BeanUtils.getBean("editconfigrightbean");
        Preconditions.notNull(editConfigRightBean);
        menuLeftBean.getLocalConfigList().remove(editConfigRightBean.getPositionOfSavedConfig());
        menuLeftBean.getLocalConfigList().add(editConfigRightBean.getDeltaConfig());
        this.deltaConfig = editConfigRightBean.getDeltaConfig();
        this.configName = editConfigRightBean.getConfigName();
        editConfigRightBean.clearSettings();
        logger.info("Add config to menu");
        LegalBean legalBean = (LegalBean) BeanUtils.getBean("legalbean");
        Preconditions.notNull(legalBean);
        legalBean.setNowUsedPage(4);
        logger.info("Go to download page");
    }

    public String getPathToDownloadFile() {
        return pathToDownloadFile;
    }

    public void setPathToDownloadFile(String pathToDownloadFile) {
        Preconditions.notNull(pathToDownloadFile);
        this.pathToDownloadFile = pathToDownloadFile;
    }

    public String getProtocol() {
        return protocol;
    }

    public void setProtocol(String protocol) {
        Preconditions.notNull(protocol);
        this.protocol = protocol;
    }

    public String getConfigName() {
        return configName;
    }

    public void setConfigName(String configName) {
        Preconditions.notNull(configName);
        this.configName = configName;
    }

    public Boolean getFlagForDownload() {
        return flagForDownload;
    }

    public void setFlagForDownload(Boolean flagForDownload) {
        Preconditions.notNull(flagForDownload);
        this.flagForDownload = flagForDownload;
    }

    public Config getDeltaConfig() {
        return deltaConfig;
    }

    public void setDeltaConfig(Config deltaConfig) {
        this.deltaConfig = deltaConfig;
    }
}
